/*
 * This file is part of the OSMembrane project.
 * More informations under www.osmembrane.de
 * 
 * The project is licensed under the GNU GENERAL PUBLIC LICENSE 3.0.
 * for more details about the license see http://www.osmembrane.de/license/
 * 
 * Source: $HeadURL: http://osmembrane-gui.googlecode.com/svn/sources/src/de/osmembrane/model/ModelProxy.java $ ($Revision: 902 $)
 * Last changed: $Date: 2011-03-09 17:41:55 +0000 (Wed, 09 Mar 2011) $
 */



package de.osmembrane.model;

import java.util.Observable;
import java.util.Observer;

import de.osmembrane.model.pipeline.AbstractFunctionPrototype;
import de.osmembrane.model.pipeline.AbstractPipeline;
import de.osmembrane.model.pipeline.FunctionPrototype;
import de.osmembrane.model.pipeline.Pipeline;
import de.osmembrane.model.preset.AbstractPresetPrototype;
import de.osmembrane.model.preset.PresetPrototype;
import de.osmembrane.model.settings.AbstractSettings;
import de.osmembrane.model.settings.Settings;
import de.osmembrane.model.statusbar.AbstractStatusbar;
import de.osmembrane.model.statusbar.Statusbar;

/**
 * The ModelProxy is the connection to the whole Model of OSMembrane. A instance
 * can got over {@link ModelProxy#getInstance()}.
 * 
 * @author jakob_jarosch
 */
public class ModelProxy extends Observable implements Observer {

	private AbstractSettings settings;
	private AbstractPipeline pipeline;
	private AbstractFunctionPrototype functionPrototype;
	private AbstractPresetPrototype presetPrototype;
	private AbstractStatusbar statusbar;

	/**
	 * Implements the Singleton pattern.
	 */
	private static ModelProxy instance = new ModelProxy();

	/**
	 * Initiates the ModelProxy.
	 */
	private ModelProxy() {
		settings = new Settings();
		settings.addObserver(this);

		pipeline = new Pipeline();
		pipeline.addObserver(this);

		functionPrototype = new FunctionPrototype();
		functionPrototype.addObserver(this);

		statusbar = new Statusbar();
		statusbar.addObserver(this);

		presetPrototype = new PresetPrototype();
	}

	/**
	 * Getter for the Singleton pattern.
	 * 
	 * @return the one and only instance of ModelProxy
	 */
	public static ModelProxy getInstance() {
		return instance;
	}

	/**
	 * Returns the {@link AbstractPipeline}.
	 * 
	 * @return give back the active {@link AbstractPipeline}
	 */
	public AbstractPipeline getPipeline() {
		return pipeline;
	}

	/**
	 * Returns the {@link AbstractSettings}.
	 * 
	 * @return give back the active {@link AbstractSettings}
	 */
	public AbstractSettings getSettings() {
		return settings;
	}

	/**
	 * Returns the {@link AbstractFunctionPrototype}.
	 * 
	 * @return give back the active {@link AbstractFunctionPrototype}
	 */
	public AbstractFunctionPrototype getFunctions() {
		return functionPrototype;
	}

	/**
	 * Returns the {@link AbstractStatusbar}.
	 * 
	 * @return give back the active {@link AbstractStatusbar}
	 */
	public AbstractStatusbar getStatusbar() {
		return statusbar;
	}

	/**
	 * Returns the {@link AbstractPresetPrototype}.
	 * 
	 * @return give back the active {@link AbstractPresetPrototype}
	 */
	public AbstractPresetPrototype getPreset() {
		return presetPrototype;
	}

	@Override
	public void update(Observable o, Object arg) {
		setChanged();
		notifyObservers(arg);
	}
}
